﻿using AutoMapper;
using Customer.API.Applcation.Command.SalesCommand;
using Customer.Domain;
using Customer.Infrstructre;
using Customer.Infrstructre.SalesManager;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using System.Xml.Linq;
using static WMSpublic.ParseAPI;
using WMSpublic;

namespace Customer.API.Applcation.CommandHandlers.SalesCommandHandler
{
    public class SalesAddCommandHandler:IRequestHandler<SalesAddCommand,int>
    {
        ISalesRepository sRep;
        ISellProductRepository spRep;
        EFCoreDBcontext dbContext;

        public SalesAddCommandHandler(ISalesRepository sRep,EFCoreDBcontext dbContext, ISellProductRepository spRep)
        {
            this.sRep = sRep;
            this.dbContext = dbContext;
            this.spRep = spRep;
        }

        public async Task<int> Handle(SalesAddCommand request, CancellationToken cancellationToken)
        {
            using (var tran = await dbContext.Database.BeginTransactionAsync((System.Data.IsolationLevel.Serializable)))
            {

                try
                {
                    List<Products> products = await GetProductsList(1, 1000);
                    Sales sales = new Sales()
                    {
                        SalesCode = request.AddDto.SalesCode,
                        DocumentType = request.AddDto.DocumentType,
                        MorderNumber = request.AddDto.MorderNumber,
                        ClientCode = request.AddDto.ClientCode,
                        ClientName = request.AddDto.ClientName,
                        SalesName = request.AddDto.SalesName,
                        SalesPhone = request.AddDto.SalesPhone,
                        ShipmentsTime = request.AddDto.ShipmentsTime,
                        Sremark = request.AddDto.Sremark,
                        MakePerson = request.AddDto.MakePerson,
                        SalesTime = request.AddDto.SalesTime,
                        Office_Id = request.AddDto.Office_Id,
                        User_Id = request.AddDto.User_Id,
                    };

                    // 先处理 sales
                    var taskToAdd = await sRep.AddAsync(sales);

                    foreach (var item in request.AddDto.addSales)
                    {
                        SellProduct detail = new SellProduct
                        {
                            SalesCode = sales.SalesCode,
                            ProductsId = item.ProductsId,
                            SellProductNum = item.SellProductNum,
                            Office_Id = request.AddDto.Office_Id,
                            User_Id = request.AddDto.User_Id,
                        };
                        //判断销售的数量是否大于产品数量
                        if(detail.SellProductNum> products.FirstOrDefault().ProcurementNum)
                        {
                            return -1;
                        }
                        else
                        {
                            await spRep.AddAsync(detail);
                        }
                    }

                    // 提交事务
                    await tran.CommitAsync();

                    return 1;  // 返回最终的结果
                }
                catch (Exception)
                {
                    // 回滚事务
                    await tran.RollbackAsync();
                    throw;
                }
            }
        }

        /// <summary>
        /// 产品
        /// </summary>
        /// <returns></returns>
        public async Task<dynamic> GetProductsList(int pindex, int psize)
        {
            string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyNiIsInNpZCI6IjE4NTk4MDM1MDY2MzA4NTY3MDQiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL2dyb3Vwc2lkIjoiMiIsImp0aSI6IjQzMzA2NmRmLWYyNjAtNDI2Ny1iYWY5LWJkMzgxZGVhZGMwYiIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiLku5jmtJvlmIkiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy91cmkiOiIiLCJpc3MiOiJSZW5hb2JvMjAwNCIsImF1ZCI6IldlaWZ1d3UyMjAzQSJ9.JtV8g_mbUcJgyPC793AMsvjLkmkeuiRR9BAH6rQp8aU";
            HttpClientWrapper cilent = new HttpClientWrapper(token);

            string chanpin = "http://10.223.8.21:8000/cpd/api/ProductRead/GetAllProductInfo?pageindex=" + pindex + "&pagesize=" + psize;

            string postReponse = await cilent.GetAsync(chanpin);
            var json = JsonConvert.DeserializeObject<ApiResultList<Products>>(postReponse);
            return json.data.list;
        }


        //产品
        public class Products
        {
            /// <summary>
            /// 产品id
            /// </summary>
            public int ProductsID { get; set; }
            /// <summary>
            /// 产品编号
            /// </summary>
            public string? ProductsCode { get; set; }
            /// <summary>
            /// 产品名称
            /// </summary>
            public string? ProductsName { get; set; }
            /// <summary>
            /// 厂商编码
            /// </summary>
            public string? VendorsCode { get; set; }
            /// <summary>
            /// 内部编码
            /// </summary>
            public string? InteriorCode { get; set; }
            /// <summary>
            /// 规格
            /// </summary>
            public string? Specs { get; set; }
            /// <summary>
            /// 产品类别
            /// </summary>
            public int? ProductTypeID { get; set; }
            /// <summary>
            /// 存储单位
            /// </summary>
            public string? StorageUnits { get; set; }
            /// <summary>
            /// 预警（上）
            /// </summary>
            public int? Upperlimit { get; set; }
            /// <summary>
            /// 预警（下）
            /// </summary>
            public int? Lowerlimit { get; set; }
            /// <summary>
            /// 包装类型
            /// </summary>
            public int? WrapType { get; set; }
            /// <summary>
            /// 价格
            /// </summary>
            public decimal? Price { get; set; }
            /// <summary>
            /// 重量
            /// </summary>
            public decimal? Weight { get; set; }
            /// <summary>
            /// 默认仓库
            /// </summary>
            public int? WarehouseId { get; set; }
            /// <summary>
            /// 库位
            /// </summary>
            public int? StorehouseId { get; set; }
            /// <summary>
            /// 默认供应商
            /// </summary>
            public int? VendorId { get; set; }
            /// <summary>
            /// 默认客户
            /// </summary>
            public int? ClientId { get; set; }
            /// <summary>
            /// 描述
            /// </summary>
            public string? Describe { get; set; }
            /// <summary>
            /// 产品数量
            /// </summary>
            public int? ProcurementNum { get; set; }
            /// <summary>
            /// 公司id
            /// </summary>
            public string? Office_Id { get; set; }

            /// <summary>
            /// 用户id
            /// </summary>
            public int? User_Id { get; set; }
        }



    }
}
